可变参数模板在实现通用库(如C++标准库)时扮演着重要的角色。

典型的应用是转发可变数量的类型参数。例如:

\begin{itemize}
\item 
向指针中堆对象的构造函数传递参数:
\begin{lstlisting}[style=styleCXX]
// create shared pointer to complex<float> initialized by 4.2 and 7.7:
auto sp = std::make_shared<std::complex<float>>(4.2, 7.7);
\end{lstlisting}

\item 
将参数传递给由线程库启动的线程:
\begin{lstlisting}[style=styleCXX]
std::thread t (foo, 42, "hello"); // call foo(42,"hello") in a separate thread
\end{lstlisting}

\item 
将参数传递给进入vector中元素的构造函数:
\begin{lstlisting}[style=styleCXX]
std::vector<Customer> v;
...
v.emplace("Tim", "Jovi", 1962); // insert a Customer initialized by three arguments
\end{lstlisting}

\end{itemize}

通常，参数使用移动语义“完美转发”(见第6.1节)，相应的声明为:

\begin{lstlisting}[style=styleCXX]
namespace std {
	template<typename T, typename... Args> shared_ptr<T>
	make_shared(Args&&... args);
	class thread {
		public:
		template<typename F, typename... Args>
		explicit thread(F&& f, Args&&... args);
		...
	};

	template<typename T, typename Allocator = allocator<T>>
	class vector {
		public:
		template<typename... Args> reference emplace_back(Args&&... args);
		...
	};
}
\end{lstlisting}

可变参数函数模板参数与普通参数适用相同的规则。通过值传递，参数复制并衰变(例如，数组变成指针)，若通过引用传递，参数指向原始参数，而不衰变:

\begin{lstlisting}[style=styleCXX]
// args are copies with decayed types:
template<typename... Args> void foo (Args... args);
// args are nondecayed references to passed objects:
template<typename... Args> void bar (Args const&... args);
\end{lstlisting}


































